package com.sosky;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 648. 单词替换
 * <p>
 * 在英语中，我们有一个叫做 词根(root)的概念，它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。
 * 例如，词根an，跟随着单词 other(其他)，可以形成新的单词 another(另一个)。
 * 现在，给定一个由许多词根组成的词典和一个句子。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根，
 * 则用最短的词根替换它。
 * 你需要输出替换之后的句子。
 * <p>
 * 示例 1：
 * 输入：dictionary = ["cat","bat","rat"], sentence = "the cattle was rattled by the battery"
 * 输出："the cat was rat by the bat"
 * <p>
 * 示例 2：
 * 输入：dictionary = ["a","b","c"], sentence = "aadsfasf absbs bbab cadsfafs"
 * 输出："a a b c"
 * <p>
 * 示例 3：
 * 输入：dictionary = ["a", "aa", "aaa", "aaaa"], sentence = "a aa a aaaa aaa aaa aaa aaaaaa bbb baba ababa"
 * 输出："a a a a a a a a bbb baba a"
 * <p>
 * 示例 4：
 * 输入：dictionary = ["catt","cat","bat","rat"], sentence = "the cattle was rattled by the battery"
 * 输出："the cat was rat by the bat"
 * <p>
 * 示例 5：
 * 输入：dictionary = ["ac","ab"], sentence = "it is abnormal that this solution is accepted"
 * 输出："it is ab that this solution is ac"
 * <p>
 * 提示：
 * 1 <= dictionary.length <= 1000
 * 1 <= dictionary[i].length <= 100
 * dictionary[i] 仅由小写字母组成。
 * 1 <= sentence.length <= 10^6
 * sentence 仅由小写字母和空格组成。
 * sentence 中单词的总量在范围 [1, 1000] 内。
 * sentence 中每个单词的长度在范围 [1, 1000] 内。
 * sentence 中单词之间由一个空格隔开。
 * sentence 没有前导或尾随空格。
 */
public class Solution648 {
    public static void main(String[] args) {
        List<String> dictionary1 = new ArrayList<>();
        dictionary1.addAll(Arrays.asList(new String[]{"cat", "bat", "rat"}));
        System.out.println(replaceWords(dictionary1, "the cattle was rattled by the battery"));

        List<String> dictionary2 = new ArrayList<>();
        dictionary2.addAll(Arrays.asList(new String[]{"a", "b", "c"}));
        System.out.println(replaceWords(dictionary2, "aadsfasf absbs bbab cadsfafs"));

        List<String> dictionary3 = new ArrayList<>();
        dictionary3.addAll(Arrays.asList(new String[]{"a", "aa", "aaa", "aaaa"}));
        System.out.println(replaceWords(dictionary3, "a aa a aaaa aaa aaa aaa aaaaaa bbb baba ababa"));

        List<String> dictionary4 = new ArrayList<>();
        dictionary4.addAll(Arrays.asList(new String[]{"catt", "cat", "bat", "rat"}));
        System.out.println(replaceWords(dictionary4, "the cattle was rattled by the battery"));

        List<String> dictionary5 = new ArrayList<>();
        dictionary5.addAll(Arrays.asList(new String[]{"ac", "ab"}));
        System.out.println(replaceWords(dictionary5, "it is abnormal that this solution is accepted"));
    }

    public static String replaceWords(List<String> dictionary, String sentence) {
        Collections.sort(dictionary);
        String[] words = sentence.split(" ");
        for (int i = 0; i < words.length; i++) {
            for (int j = 0; j < dictionary.size(); j++) {
                if (words[i].startsWith(dictionary.get(j))) {
                    words[i] = dictionary.get(j);
                    break;
                }
            }
        }
        return Arrays.asList(words).stream().collect(Collectors.joining(" "));
    }
}
